﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace iot.Jobs
{
     class ThreadPoolConfig
    {
        public static void ConfigureThreadPool()
        {
            int processorCount = Environment.ProcessorCount;
            Console.WriteLine($"系统处理器核心数: {processorCount}");

            // 推荐配置方案
            int minWorker, minIo;
            int maxWorker, maxIo;

            // 根据应用类型选择配置方案
            if (IsCpuIntensiveApplication())
            {
                // CPU密集型应用配置
                minWorker = minIo = processorCount;
                maxWorker = processorCount * 2;
                maxIo = processorCount * 2;
            }
            else
            {
                // I/O密集型或混合型应用配置
                minWorker = processorCount;
                minIo = processorCount * 2;
                maxWorker = processorCount * 5;
                maxIo = processorCount * 10;
            }

            // 设置线程池
            SetThreadPoolLimits(minWorker, minIo, maxWorker, maxIo);
        }

        private static bool IsCpuIntensiveApplication()
        {
            // 这里添加你的应用类型判断逻辑
            // 返回true表示CPU密集型，false表示I/O密集型
            return true;
        }

        private static void SetThreadPoolLimits(int minWorker, int minIo, int maxWorker, int maxIo)
        {
            // 先设置最大线程数，再设置最小线程数（避免最小>最大导致的错误）
            if (ThreadPool.SetMaxThreads(maxWorker, maxIo))
            {
                Console.WriteLine($"最大线程数设置成功: 工作线程={maxWorker}, I/O线程={maxIo}");
            }
            else
            {
                Console.WriteLine("最大线程数设置失败");
            }

            if (ThreadPool.SetMinThreads(minWorker, minIo))
            {
                Console.WriteLine($"最小线程数设置成功: 工作线程={minWorker}, I/O线程={minIo}");
            }
            else
            {
                Console.WriteLine("最小线程数设置失败");
            }

            // 验证设置
            ThreadPool.GetMinThreads(out int actualMinWorker, out int actualMinIo);
            ThreadPool.GetMaxThreads(out int actualMaxWorker, out int actualMaxIo);
            Console.WriteLine($"实际设置验证:");
            Console.WriteLine($"最小 - 工作线程: {actualMinWorker}, I/O线程: {actualMinIo}");
            Console.WriteLine($"最大 - 工作线程: {actualMaxWorker}, I/O线程: {actualMaxIo}");
        }
    }
}
